using System.Collections.Generic;
using Godot;

namespace RoboRampage.Player;

/// <summary>
/// 弹药管理器
/// </summary>
[Tool]
public partial class AmmonHandler : Node
{
    [Export] public Label ExAmmoLabel; // 弹药数量标签

    private EnumTypeAmmo _currAmmoType;

    // 获取或设置当前弹药类型
    public EnumTypeAmmo CurrAmmoType
    {
        get => _currAmmoType;
        set => _currAmmoType = value;
    }

// 定义一个枚举类型 EnumTypeAmmo，用于表示不同类型的弹药
    public enum EnumTypeAmmo
    {
        Bullet, // 子弹
        SmallBullet, // 小子弹
    }

// 定义一个只读的字典 _ammoStorage，用于存储不同类型弹药的剩余数量
    private readonly Dictionary<EnumTypeAmmo, int> _ammoStorage = new()
    {
        { EnumTypeAmmo.Bullet, 10 }, // 初始化子弹类型的剩余数量为10
        { EnumTypeAmmo.SmallBullet, 60 }, // 初始化小弹类型的剩余数量为60
    };

// 检查指定类型的弹药是否有剩余
    public bool HasAmmo(EnumTypeAmmo ammoType)
    {
        // 返回 _ammoStorage 中指定弹药类型的数量是否大于0
        // _ammoStorage 字典,用于存储不同类型弹药的剩余数量
        // ammoType 是一个枚举类型，表示弹药的类型
        return _ammoStorage[ammoType] > 0;
    }
// 检查指定类型的弹药是否有剩余
// 使用指定类型的弹药

// 如果有剩余，减少该类型弹药的数量
    public void UseAmmo(EnumTypeAmmo ammoType)
    {
        // 打印当前该类型弹药的剩余数量
        if (!HasAmmo(ammoType)) return;
        _ammoStorage[ammoType]--;
        // GD.Print(_ammoStorage[ammoType]);
        UpdateAmmoLabel(ammoType);
    }

// 更新弹药标签的显示
    public void UpdateAmmoLabel(EnumTypeAmmo ammoType)
    {
        CurrAmmoType = ammoType;
        // 将传入的弹药类型 ammoType 作为键，从 _ammoStorage 字典中获取对应的弹药数量
        // 将获取到的弹药数量转换为字符串，并设置为 ExAmmoLabel 的文本内容
        ExAmmoLabel.Text = _ammoStorage[ammoType].ToString();
    }

// 用于向弹药库中添加弹药
    public void AddAmmo(EnumTypeAmmo ammoType, int ammoCount)
    {
        // 使用索引器访问_ammoStorage字典，将指定类型的弹药数量增加指定的数量
        // EnumTypeAmmo ammoType: 弹药类型，使用枚举类型来指定不同的弹药种类
        // int ammoCount: 要添加的弹药数量
        _ammoStorage[ammoType] += ammoCount;
        // 如果是当前弹药类型，则更新数量显示
        if (CurrAmmoType == ammoType)
        {
            // 更新弹药标签，显示当前弹药数量
            UpdateAmmoLabel(ammoType);
        }
    }
}